// 推荐：https://juejin.cn/post/6889663131934130183


function Parent() {
  this.type = 'parent';
}

Parent.prototype.eat = function() {
  console.log('eat')
}

function Child(name) {
  this.name = name
}
//================以上为类定义


// 原型链继承
Child.prototype = new Parent(); //只会new这一次
// 引用类型的属性被所有实例共享
// 在创建 Child 的实例时，不能向Parent传参


// 构造继承
function Child(name){
  Parent.call(this);  //每创建一个Child都要new Parent一下
}
// 方法都在构造函数中定义，每次创建实例都会创建一遍方法


// 组合继承-->父类方法都写在链上
function Child(name){
  Parent.call(this)
}
Child.prototype = new Parent()
Child.prototype.constructor = Child

// 原型式继承
function F() {}
F.prototype = Person.prototype
Child.prototype = new F()
Child.prototype.constructor = Child
// 简化写法
Child.prototype = Object.create(Parent, { constructor: Child })


// 寄生式
function createObj(obj){
  var clone = Object.create(obj);
  clone.sayName = function(){
    console.log("hi")
  }
  return clone
}


// 寄生组合继承
// 减少了一次对Parent构造函数的调用
function Child(name) {
  Parent.call(this)
}

var F = function() {}
F.prototype = Parent.prototype
Child.prototype = new F();


